local msgpack = require("MessagePack")

-- Lua层间通信的打包拆包 ----------------------------------------

-- 打包给另一个Lua层（参数是表）
function Pack2Lua(data)
    if type(data) ~= "table" then
        return false
    end

    -- 对面也是lua，可以直接使用表打包
    local ok, str = pcall(msgpack.pack, data)
    if not ok then return false end

    return true, str
end

-- 拆包来自另一个lua层（数据是一张表，不用特殊处理）
function UnpackFromLua(str)
    if type(str) ~= "string" or #str == 0 then
        return false
    end

    -- 二进制存储的是lua的表，可以解析直接使用
    local ok, data = pcall(msgpack.unpack, str)
    if not ok or type(data) ~= "table" then
        print("lua层收到一个不是字符串不能解析成表的消息")
        return false
    end

    return true, data
end




-- C++层通信的打包拆包 ------------------------------------------
---C++层是用unorder_map<string, string>数据结构存储

-- 打包给C++层（参数是表）
function Pack2CPP(data)
    if type(data) ~= "table" then
        return false
    end

    -- 转换为纯字符串键值对
    local cpp_data = {}
    for k, v in pairs(data) do
        cpp_data[tostring(k)] = tostring(v)
    end

    local ok, str = pcall(msgpack.pack, cpp_data)
    if not ok then return false end

    return true, str
end

-- 拆包来自C++层
function UnpackFromCPP(str)
    if type(str) ~= "string" or #str == 0 then
        return false
    end

    local ok, data = pcall(msgpack.unpack, str)
    if not ok or type(data) ~= "table" then
        return false
    end

    -- 确保所有值都是字符串
    local result = {}
    for k, v in pairs(data) do
        result[tostring(k)] = tostring(v)
    end

    return true, result
end

